#Boa:Dialog:Altaproductos

import wx
import wx.lib.masked.timectrl
import wx.lib.masked.textctrl
import wx.lib.stattext
import wx.lib.masked.numctrl
import wx.lib.intctrl
import wx.grid
import consultasBD
import sincronizar_tabla  
import utiles
from decimal import Decimal

def create(parent):
    return Altaproductos(parent)

[wxID_ALTAPRODUCTOS, wxID_ALTAPRODUCTOSANIO, wxID_ALTAPRODUCTOSBUTTON1, 
 wxID_ALTAPRODUCTOSBUTTON2, wxID_ALTAPRODUCTOSCHECKBOX1, 
 wxID_ALTAPRODUCTOSCODSUSSAN, wxID_ALTAPRODUCTOSCOMBOBOX1, 
 wxID_ALTAPRODUCTOSDESCRI, wxID_ALTAPRODUCTOSESTACION, 
 wxID_ALTAPRODUCTOSGENSTATICTEXT1, wxID_ALTAPRODUCTOSGENSTATICTEXT3, 
 wxID_ALTAPRODUCTOSGRUPO, wxID_ALTAPRODUCTOSINCODPRODUCTO, 
 wxID_ALTAPRODUCTOSINCODPROVEE, wxID_ALTAPRODUCTOSINNOMBREPROVEE, 
 wxID_ALTAPRODUCTOSINPARAMETRO, wxID_ALTAPRODUCTOSPCOMPRA, 
 wxID_ALTAPRODUCTOSPVENTA, wxID_ALTAPRODUCTOSPVENTA2, 
 wxID_ALTAPRODUCTOSSTATICLINE1, wxID_ALTAPRODUCTOSSTATICTEXT1, 
 wxID_ALTAPRODUCTOSSTATICTEXT10, wxID_ALTAPRODUCTOSSTATICTEXT2, 
 wxID_ALTAPRODUCTOSSTATICTEXT3, wxID_ALTAPRODUCTOSSTATICTEXT4, 
 wxID_ALTAPRODUCTOSSTATICTEXT5, wxID_ALTAPRODUCTOSSTATICTEXT6, 
 wxID_ALTAPRODUCTOSSTATICTEXT7, wxID_ALTAPRODUCTOSSTATICTEXT8, 
 wxID_ALTAPRODUCTOSSTATICTEXT9, 
] = [wx.NewId() for _init_ctrls in range(30)]

class Altaproductos(wx.Dialog):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_ALTAPRODUCTOS, name='Altaproductos',
              parent=prnt, pos=wx.Point(478, 230), size=wx.Size(482, 295),
              style=wx.DEFAULT_DIALOG_STYLE, title='Alta Productos')
        self.SetClientSize(wx.Size(474, 268))

        self.staticText2 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT2,
              label='Proveedor', name='staticText2', parent=self,
              pos=wx.Point(8, 8), size=wx.Size(55, 13), style=0)

        self.genStaticText3 = wx.lib.stattext.GenStaticText(ID=wxID_ALTAPRODUCTOSGENSTATICTEXT3,
              label='Cod:', name='genStaticText3', parent=self, pos=wx.Point(96,
              8), size=wx.Size(24, 13), style=0)

        self.incodprovee = wx.TextCtrl(id=wxID_ALTAPRODUCTOSINCODPROVEE,
              name=u'incodprovee', parent=self, pos=wx.Point(134, 8),
              size=wx.Size(74, 21), style=0, value='')
        self.incodprovee.SetEditable(False)
        self.incodprovee.Enable(True)

        self.button1 = wx.Button(id=wxID_ALTAPRODUCTOSBUTTON1, label='Buscar',
              name='button1', parent=self, pos=wx.Point(392, 8),
              size=wx.Size(75, 23), style=0)
        self.button1.Show(False)
        self.button1.Bind(wx.EVT_BUTTON, self.OnBuscar,
              id=wxID_ALTAPRODUCTOSBUTTON1)

        self.innombreprovee = wx.TextCtrl(id=wxID_ALTAPRODUCTOSINNOMBREPROVEE,
              name='innombreprovee', parent=self, pos=wx.Point(208, 8),
              size=wx.Size(136, 21), style=0, value='')
        self.innombreprovee.SetEditable(False)
        self.innombreprovee.Enable(True)

        self.inparametro = wx.TextCtrl(id=wxID_ALTAPRODUCTOSINPARAMETRO,
              name='inparametro', parent=self, pos=wx.Point(344, 8),
              size=wx.Size(36, 21), style=0, value='')
        self.inparametro.Show(True)
        self.inparametro.Enable(True)
        self.inparametro.SetEditable(False)

        self.staticText1 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT1,
              label='Codigo Art. Proveedor', name='staticText1', parent=self,
              pos=wx.Point(8, 40), size=wx.Size(108, 13), style=0)

        self.incodproducto = wx.TextCtrl(id=wxID_ALTAPRODUCTOSINCODPRODUCTO,
              name='incodproducto', parent=self, pos=wx.Point(134, 40),
              size=wx.Size(74, 21), style=0, value='')
        self.incodproducto.SetEditable(False)
        self.incodproducto.Enable(True)

        self.staticText3 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT3,
              label='Codigo Art. Sussan', name='staticText3', parent=self,
              pos=wx.Point(8, 72), size=wx.Size(92, 13), style=0)

        self.codsussan = wx.TextCtrl(id=wxID_ALTAPRODUCTOSCODSUSSAN,
              name='codsussan', parent=self, pos=wx.Point(134, 72),
              size=wx.Size(74, 21), style=0, value='')
        self.codsussan.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.codsussan.SetEditable(False)
        self.codsussan.Enable(True)

        self.staticText4 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT4,
              label=u'A\xf1o:', name='staticText4', parent=self,
              pos=wx.Point(400, 56), size=wx.Size(24, 13), style=0)

        self.estacion = wx.ComboBox(choices=["Verano", "Primavera", "Otono",
              "Invierno"], id=wxID_ALTAPRODUCTOSESTACION, name='estacion',
              parent=self, pos=wx.Point(320, 72), size=wx.Size(80, 21), style=0,
              value='')
        self.estacion.SetLabel('')

        self.anio = wx.ComboBox(choices=[], id=wxID_ALTAPRODUCTOSANIO,
              name='anio', parent=self, pos=wx.Point(400, 72), size=wx.Size(64,
              21), style=0, value='')

        self.staticText9 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT9,
              label='Descripci\xf3n', name='staticText9', parent=self,
              pos=wx.Point(8, 104), size=wx.Size(54, 13), style=0)

        self.descri = wx.TextCtrl(id=wxID_ALTAPRODUCTOSDESCRI, name='descri',
              parent=self, pos=wx.Point(80, 104), size=wx.Size(384, 21),
              style=0, value='')
        self.descri.Bind(wx.EVT_KILL_FOCUS, self.OnDescriKillFocus)

        self.staticText5 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT5,
              label='Grupo', name='staticText5', parent=self, pos=wx.Point(8,
              136), size=wx.Size(29, 13), style=0)

        self.grupo = wx.ComboBox(choices=[], id=wxID_ALTAPRODUCTOSGRUPO,
              name='grupo', parent=self, pos=wx.Point(80, 136),
              size=wx.Size(184, 21), style=0, value='')
        self.grupo.SetLabel('')

        self.staticText6 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT6,
              label='Estacion:', name='staticText6', parent=self,
              pos=wx.Point(320, 56), size=wx.Size(45, 13), style=0)

        self.staticText10 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT10,
              label='Precio Costo\nProveedor', name='staticText10', parent=self,
              pos=wx.Point(8, 168), size=wx.Size(60, 26), style=0)

        self.pventa2 = wx.TextCtrl(id=wxID_ALTAPRODUCTOSPVENTA2,
              name=u'pventa2', parent=self, pos=wx.Point(80, 168),
              size=wx.Size(80, 21), style=wx.TE_RIGHT | wx.TE_LEFT,
              value='0.00')
        self.pventa2.SetEditable(True)
        self.pventa2.Enable(True)
        self.pventa2.Bind(wx.EVT_KILL_FOCUS,
              self.OnPrecioCostoProveedorKillFocus)

        self.pcompra = wx.TextCtrl(id=wxID_ALTAPRODUCTOSPCOMPRA, name='pcompra',
              parent=self, pos=wx.Point(80, 200), size=wx.Size(80, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.pcompra.Bind(wx.EVT_KILL_FOCUS, self.OnPcompraKillFocus)

        self.staticText8 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT8,
              label='Valor calculo\nprecio venta', name='staticText8',
              parent=self, pos=wx.Point(8, 200), size=wx.Size(60, 26), style=0)

        self.genStaticText1 = wx.lib.stattext.GenStaticText(ID=wxID_ALTAPRODUCTOSGENSTATICTEXT1,
              label='Precio Venta', name='genStaticText1', parent=self,
              pos=wx.Point(8, 232), size=wx.Size(60, 13), style=0)

        self.pventa = wx.TextCtrl(id=wxID_ALTAPRODUCTOSPVENTA, name='pventa',
              parent=self, pos=wx.Point(80, 232), size=wx.Size(80, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.pventa.SetEditable(False)
        self.pventa.Enable(False)

        self.checkBox1 = wx.CheckBox(id=wxID_ALTAPRODUCTOSCHECKBOX1,
              label='Ropa economica', name='checkBox1', parent=self,
              pos=wx.Point(192, 240), size=wx.Size(104, 13), style=0)
        self.checkBox1.SetValue(False)
        self.checkBox1.Enable(True)
        self.checkBox1.Bind(wx.EVT_CHECKBOX, self.OnRopaEconomica,
              id=wxID_ALTAPRODUCTOSCHECKBOX1)

        self.button2 = wx.Button(id=wxID_ALTAPRODUCTOSBUTTON2,
              label='Guardar Articulo ', name='button2', parent=self,
              pos=wx.Point(372, 224), size=wx.Size(96, 32), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnButtonGuardarArticulo,
              id=wxID_ALTAPRODUCTOSBUTTON2)

        self.staticLine1 = wx.StaticLine(id=wxID_ALTAPRODUCTOSSTATICLINE1,
              name='staticLine1', parent=self, pos=wx.Point(9, 98),
              size=wx.Size(455, 2), style=0)

        self.staticText7 = wx.StaticText(id=wxID_ALTAPRODUCTOSSTATICTEXT7,
              label='Temporada', name='staticText7', parent=self,
              pos=wx.Point(216, 56), size=wx.Size(54, 13), style=0)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_ALTAPRODUCTOSCOMBOBOX1,
              name='comboBox1', parent=self, pos=wx.Point(216, 72),
              size=wx.Size(104, 21), style=0, value='')
        self.comboBox1.SetLabel('')
        self.comboBox1.Bind(wx.EVT_COMBOBOX, self.OnCambiaTemporada,
              id=wxID_ALTAPRODUCTOSCOMBOBOX1)

    def __init__(self, parent,proveedor,codartprov,esalta,temporada=""):
        self._init_ctrls(parent)
        self.CargaAnioCombo()
        self.CargaGruposCombo()
        self.cargaTemporadaCombo()
        if esalta ==1 :
            for i,item in enumerate(self.comboBox1.GetItems()):
                if item==temporada: 
                    self.comboBox1.SetSelection(i)
                    break
            tablaSQL = "proveedor"
            camposSQL = "nombre,parametro"
            condicion = "idproveedor = "+str(proveedor)
            if temporada[:5]=="INVIE": posicion = 3
            elif temporada[:5]=="VERAN": posicion = 0
            else: posicion = -1
            self.estacion.SetSelection(posicion)
            anio = temporada[-4:]
            for indice,x in enumerate(self.anio.GetItems()):
                if x == anio: break
            self.anio.SetSelection(indice)
            resultado = consultasBD.executaSQL(self,camposSQL,tablaSQL,condicion)
            for r in resultado:
                nombreprovee = r[0]
                parametro = r[1]
                
            self.innombreprovee.ChangeValue(nombreprovee)
            self.incodprovee.SetValue(proveedor)
            self.inparametro.ChangeValue(parametro)
            
            #busco el nuevo idsussan
            tablaSQL = "indices"
            camposSQL = "*"
            condicion = "1"
            resultado = consultasBD.executaSQL(self,camposSQL,tablaSQL,condicion)
            for r in resultado:
                nuevocodsussan = r[0]
            
            self.codsussan.ChangeValue(str(nuevocodsussan))
            
            if not codartprov:
                codartprov = str(nuevocodsussan)
            
            self.incodproducto.ChangeValue(codartprov)            
            self._actualizar_codsussan()
        else:
            #arreglar aca
            pass
    
    def CargaGruposCombo(self):
        list = []
        condicionSQL = "1 ORDER BY nombregrupo"
        resultados = consultasBD.executaSQL(self,"*","grupos",condicionSQL)
        for r in resultados:
            list.append(str(r[1])+" / "+str(r[0]))
        
        self.grupo.SetItems(list)
        return #list
    
    def CargaAnioCombo(self):
        anioActual = utiles.getfecha()[-4:]
        anioAnterior = str(int(anioActual)-1)
        anioSiguiente= str(int(anioActual)+1)
        self.anio.Append(anioAnterior)
        self.anio.Append(anioActual)
        self.anio.Append(anioSiguiente)
        #estableciendo el anio actual como valor por defecto del combo
        self.anio.SetLabel(anioActual)
        self.anio.SetSelection(-1)

    def cargaTemporadaCombo(self):
        anio = int(utiles.obtenerFecha("Y-m-d")[:4])
        mes = int(utiles.obtenerFecha("Y-m-d")[5:7])
        dia = int(utiles.obtenerFecha("Y-m-d")[-2:])
        anioanterior = anio -1
        anioactual = anio
        aniosiguiente = anio + 1
        self.comboBox1.Append("INVIERNO"+str(anioanterior))
        self.comboBox1.Append("VERANO"+str(anioanterior))
        self.comboBox1.Append("INVIERNO"+str(anioactual))
        self.comboBox1.Append("VERANO"+str(anioactual))
        self.comboBox1.Append("INVIERNO"+str(aniosiguiente))
        self.comboBox1.Append("VERANO"+str(aniosiguiente))
        self.comboBox1.SetEditable(False)

    def _guardar_producto(self):
        codartprov = self.incodproducto.Value
        codsussan = self.codsussan.Value
        codbarra = "" #no se genera aun
        proveedor = self.incodprovee.Value
        descri = self.descri.Value
        preciolt1 = self.pventa.Value #precio venta
        preciolt2 = self.pventa2.Value #costo
        preciocompra = preciolt2 #costo
        estacion = self.estacion.Value 
        talle = ""
        anio = self.anio.Value
        color = ""
        grupo = self.grupo.Value
        grupo = grupo.split(' / ')[1]
        stock = 0
        temporada = self.comboBox1.GetLabel()

        precio1,precio2,precio0 = self.calculoPrecioSugerido()
        
##        if not codartprov:
##            codartprov = codsussan

        try:
            consultasBD.begin()        
            r1 = "INSERT INTO productos ("
            r2 = "codsussan, proveedor, descri, "
            r3 = "preciolt1, preciolt2, preciocompra, "
            r4 = "estacion, anio, grupo, temporada) "
            r5 = "VALUES ("
            r6 = "'%s', '%s', '%s'," % (codsussan, proveedor, descri)
            r7 = "'%s', '%s', '%s'," % (preciolt1, preciolt2, preciocompra)
            r8 = "'%s','%s','%s','%s')" % (estacion, anio, grupo, temporada)
            sql_producto = r1+r2+r3+r4+r5+r6+r7+r8
            sincronizar_tabla.addChange(sql=sql_producto)
            consultasBD.executaSinCommit(None, sql_producto)
            
            r1 = "INSERT INTO producto_codartprov (codsussan, codartprov) "
            r2 = "VALUES ('%s', '%s')" % (codsussan, codartprov)
            sql_codartprov = r1+r2
            #sincronizar_tabla.addChange(sql=sql_codartprov)
            consultasBD.executaSinCommit(None, sql_codartprov)

            if precio1 != precio2:
                fecha = utiles.obtenerFecha("Y-m-d h:m:s")
                r1 = "INSERT INTO comprascambiosprecios(fecha,codsussan,costo,sugerido,final) "
                r2 = "VALUES('%s','%s','%s','%s','%s')" % (fecha,codsussan,precio0,precio1,precio2)
                sql = r1+r2
                consultasBD.executaSinCommit(None, sql)
            
            consultasBD.commit()
            sincronizar_tabla.syncServerTables(self, ["productos"])
            utiles.mensaje(self, "El producto se guardo y sincronizo")
        except Exception, e:
            print e.__str__()
            utiles.mensaje(self, "NO se pudo guardar el producto")
            consultasBD.rollback()         
    
    def get_codsussan(self):
        return self.codsussan.Value
        
    def _actualizar_codsussan(self):
        codsussan = self.codsussan.Value
        codsussan = int(codsussan) + 1
        
        sql = "UPDATE indices SET ultimoidcod = %s" % str(codsussan)
        consultasBD.executa(None, sql)

    def OnButtonGuardarArticulo(self, event):
        if self.estacion.GetValue()=="":
            utiles.mensaje(None,"Debe especificar Estacion")
            self.estacion.SetFocus()
            return
        if self.anio.GetValue()=="":
            utiles.mensaje(None,"Debe especificar Anio")
            self.anio.SetFocus()
            return
        if self.grupo.GetSelection()==-1:
            utiles.mensaje(None,"Debe especificar Grupo")
            self.anio.SetFocus()
            return
        if self.descri.GetLabel()=="":
            utiles.mensaje(None,"Debe introducir una descripcion")
            self.anio.SetFocus()
            return
        try:
            if Decimal(self.pventa2.GetLabel())==Decimal("0.00"):
                utiles.mensaje(None,"El precio de venta no puede ser 0")
                self.anio.SetFocus()
                return
        except:
            utiles.mensaje(None,"Debe introducir un precio de venta valido")
            self.anio.SetFocus()
            return
        try:
            if Decimal(self.pcompra.GetLabel())==Decimal("0.00"):
                utiles.mensaje(None,"El precio para calcular el valor\nde compra debe ser distinto a 0")
                self.anio.SetFocus()
                return
        except:
            utiles.mensaje(None,"Debe introducir un valor para\nel calculo de precio de venta")
            self.anio.SetFocus()
            return
            
        self._guardar_producto()
        self._actualizar_codsussan()
        
        #msg correcto
        self.Close()

    def calculoPrecioSugerido(self):
        #actualiza automaticamente el precio de VENTA
        iva = Decimal("1.21").quantize(Decimal("0.10"))
        cien = Decimal("100.00").quantize(Decimal("0.10"))
        porigen = self.pventa2.GetLabel()
        try:
            porigen = Decimal(porigen).quantize(Decimal("0.10"))
        except:
            porigen = Decimal("0.00").quantize(Decimal("0.10"))
        parametro = self.inparametro.GetLabel()
        try:
            parametro = Decimal(parametro).quantize(Decimal("0.10"))
        except:
            parametro = Decimal("0.00").quantize(Decimal("0.10"))
        intermedio = porigen + porigen * parametro / cien
        pventa = (intermedio * iva).quantize(Decimal("0.10"))
        pventa = Decimal(str(round(pventa))).quantize(Decimal("0.10"))
        pcalculado = self.pventa.GetLabel()
        return str(pventa),pcalculado,str(porigen)

    def OnPcompraKillFocus(self, event):
        #actualiza automaticamente el precio de VENTA
        if self.checkBox1.GetValue():
            iva = Decimal("1.00")
        else:
            iva = Decimal("1.21").quantize(Decimal("0.10"))
        cien = Decimal("100.00").quantize(Decimal("0.10"))
        porigen = self.pventa2.GetLabel()
        pcosto = self.pcompra.GetLabel()
        parametro = self.inparametro.GetLabel()
        try:
            pcosto = Decimal(pcosto).quantize(Decimal("0.10"))
        except:
            pcosto = Decimal("0.00")
        try:
            parametro = Decimal(parametro).quantize(Decimal("0.10"))
        except:
            parametro = Decimal("0.00")
        #precio venta = precio costo + iva + parametro
        intermedio = (pcosto*iva).quantize(Decimal("0.10"))
        if self.checkBox1.GetValue():
            pventa = (intermedio*Decimal("2.00")).quantize(Decimal("0.10"))
        else:
            pventa = Decimal(str(round((intermedio*parametro/cien).quantize(Decimal("0.10"))+intermedio))).quantize(Decimal("0.10"))
        self.pventa.SetLabel(str(pventa))

    def OnRopaEconomica(self, event):
        self.OnPcompraKillFocus(None)
        
    def OnBuscar(self, event):
        event.Skip()

    def OnPrecioCostoProveedorKillFocus(self, event):
        self.pcompra.SetLabel(self.pventa2.GetLabel())

    def OnDescriKillFocus(self, event):
        self.descri.SetLabel((self.descri.GetLabel()).upper())

    def OnCambiaTemporada(self, event):
        temporada = self.comboBox1.GetLabel()
        if temporada[:5]=="INVIE": posicion = 3
        elif temporada[:5]=="VERAN": posicion = 0
        else: posicion = -1
        self.estacion.SetSelection(posicion)
        anio = temporada[-4:]
        for indice,x in enumerate(self.anio.GetItems()):
            if x == anio: break
        self.anio.SetSelection(indice)
